Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_android_codec2.py

Displaying Raw • Download


tests/backend/test_android_codec2.py 9ea4efe98ab64cc1294fae7fd9909e6edc4e4c1f (9ea4efe9) Text, 11.49 KB

T8b949e# SPDX-License-Identifier: 0BSD

Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3patch

Tff7b72import T7ee787pytest

Tff7b72from T7ee787meshchatx Tff7b72import Te6edf3android_codec2


Tff7b72def Td2a8fftest_ensure_codec2_skips_non_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3android_codec2Tff7b72.Td2a8ffreset_codec2_preload_state_for_testsTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3android_codec2Tff7b72.Td2a8ffensure_codec2_native_libraryTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3android_codec2Tff7b72.Td2a8ffcodec2_preload_errorTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72None


Tff7b72def Td2a8fftest_ensure_codec2_loads_bundled_libraryTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3lib Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"
Te6edf3libTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x7fTa5d6ffELFTa5d6ff"Tb4b4b4)

Te6edf3android_codec2Tff7b72.Td2a8ffreset_codec2_preload_state_for_testsTb4b4b4(Tb4b4b4)

Tff7b72with Tb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ff_java_system_load_libraryTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3android_codec2Tb4b4b4,
Ta5d6ff"Ta5d6ff_cdll_loadTa5d6ff"Tb4b4b4,
Te6edf3side_effectTff7b72=Tb4b4b4[Tf85149OSErrorTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72NoneTb4b4b4]Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3cdllTb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3android_codec2Tb4b4b4,
Ta5d6ff"Ta5d6ff_libcodec2_candidatesTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tb4b4b4[Te6edf3libTb4b4b4]Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3android_codec2Tff7b72.Td2a8ffensure_codec2_native_libraryTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3cdllTff7b72.Td2a8ffcall_count Tff7b72== T79c0ff2
Tff7b72assert Te6edf3cdllTff7b72.Td2a8ffcall_args_listTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffargsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"
Tff7b72assert Te6edf3cdllTff7b72.Td2a8ffcall_args_listTb4b4b4[T79c0ff1Tb4b4b4]Tff7b72.Td2a8ffargsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Tffa657strTb4b4b4(Te6edf3libTb4b4b4)


Tff7b72def Td2a8fftest_ensure_codec2_prefers_java_load_libraryTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3android_codec2Tff7b72.Td2a8ffreset_codec2_preload_state_for_testsTb4b4b4(Tb4b4b4)
Tff7b72with Tb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ff_java_system_load_libraryTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72True
Tb4b4b4) Tff7b72as Te6edf3java_loadTb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ff_java_system_load_absoluteTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ff_cdll_loadTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3cdllTb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ff_libcodec2_candidatesTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
T8b949e# Bare soname CDLL may still fail after Java load. Absolute candidates empty.
Te6edf3cdllTff7b72.Td2a8ffside_effect Tff7b72= Tb4b4b4[Tf85149OSErrorTb4b4b4(Ta5d6ff"Ta5d6ffno bare sonameTa5d6ff"Tb4b4b4)Tb4b4b4]
Tff7b72assert Te6edf3android_codec2Tff7b72.Td2a8ffensure_codec2_native_libraryTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Te6edf3java_loadTff7b72.Td2a8ffassert_called_once_withTb4b4b4(Ta5d6ff"Ta5d6ffcodec2Ta5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3cdllTff7b72.Td2a8ffcall_count Tff7b72>Tff7b72= T79c0ff1
Tff7b72assert Te6edf3android_codec2Tff7b72.Td2a8ffcodec2_preload_errorTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72None


Tff7b72def Td2a8fftest_libcodec2_candidates_find_without_importing_pycodec2Tb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
T8b949e"""Discovery must not import pycodec2 (extension needs libcodec2 already loaded)."""
Te6edf3site Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffsite-packagesTa5d6ff"
Te6edf3pkg Tff7b72= Te6edf3site Tff7b72/ Ta5d6ff"Ta5d6ffpycodec2Ta5d6ff"
Te6edf3pkgTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3lib Tff7b72= Te6edf3pkg Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"
Te6edf3libTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x7fTa5d6ffELFTa5d6ff"Tb4b4b4)
Te6edf3monkeypatchTff7b72.Td2a8ffsyspath_prependTb4b4b4(Tffa657strTb4b4b4(Te6edf3siteTb4b4b4)Tb4b4b4)

Tff7b72import T7ee787builtins

Te6edf3real_import Tff7b72= Te6edf3builtinsTff7b72.Td2a8ff__import__

Tff7b72def Td2a8fffake_importTb4b4b4(Te6edf3nameTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffpycodec2Ta5d6ff" Tff7b72or Te6edf3nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffpycodec2.Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149ImportErrorTb4b4b4(Ta5d6ff"Ta5d6ffpycodec2 must not be imported during candidate searchTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3real_importTb4b4b4(Te6edf3nameTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffbuiltins.__import__Ta5d6ff"Tb4b4b4, Te6edf3side_effectTff7b72=Te6edf3fake_importTb4b4b4)Tb4b4b4:
Te6edf3candidates Tff7b72= Te6edf3android_codec2Tff7b72.Td2a8ff_libcodec2_candidatesTb4b4b4(Tb4b4b4)

Tff7b72assert Te6edf3libTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4) Tff7b72in Tb4b4b4[Te6edf3cTff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3c Tff7b72in Te6edf3candidatesTb4b4b4]


Tff7b72def Td2a8fftest_probe_pycodec2_reports_failure_when_import_breaksTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3android_codec2Tff7b72.Td2a8ffreset_codec2_preload_state_for_testsTb4b4b4(Tb4b4b4)
Te6edf3android_codec2Tff7b72.Td2a8ff_codec2_preload_attempted Tff7b72= Tff7b72True
Te6edf3android_codec2Tff7b72.Td2a8ff_codec2_preload_ok Tff7b72= Tff7b72True
Te6edf3android_codec2Tff7b72.Td2a8ff_codec2_preload_error Tff7b72= Tff7b72None
Tff7b72with Tb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffdictTb4b4b4(Ta5d6ff"Ta5d6ffsys.modulesTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffpycodec2Ta5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72import T7ee787builtins

Te6edf3real_import Tff7b72= Te6edf3builtinsTff7b72.Td2a8ff__import__

Tff7b72def Td2a8fffake_importTb4b4b4(Te6edf3nameTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffpycodec2Ta5d6ff"Tb4b4b4:
Tff7b72raise Tf85149ImportErrorTb4b4b4(Ta5d6ff"Ta5d6ffno pycodec2Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3real_importTb4b4b4(Te6edf3nameTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)

Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffbuiltins.__import__Ta5d6ff"Tb4b4b4, Te6edf3side_effectTff7b72=Te6edf3fake_importTb4b4b4)Tb4b4b4:
Te6edf3okTb4b4b4, Te6edf3err Tff7b72= Te6edf3android_codec2Tff7b72.Td2a8ffprobe_pycodec2Tb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3ok Tff7b72is Tff7b72False
Tff7b72assert Te6edf3err


Tff7b72def Td2a8fftest_ensure_lxst_codec2_binding_reloads_when_codec2_noneTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72import T7ee787types

Te6edf3android_codec2Tff7b72.Td2a8ffreset_codec2_preload_state_for_testsTb4b4b4(Tb4b4b4)

Te6edf3fake_codecs Tff7b72= Te6edf3typesTff7b72.Td2a8ffModuleTypeTb4b4b4(Ta5d6ff"Ta5d6ffLXST.CodecsTa5d6ff"Tb4b4b4)
Te6edf3fake_codecsTff7b72.Td2a8ffCodec2 Tff7b72= Tff7b72None

Te6edf3reloaded Tff7b72= Te6edf3typesTff7b72.Td2a8ffModuleTypeTb4b4b4(Ta5d6ff"Ta5d6ffLXST.CodecsTa5d6ff"Tb4b4b4)
Te6edf3reloadedTff7b72.Td2a8ffCodec2 Tff7b72= Tffa657objectTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffimport_moduleTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffLXST.CodecsTa5d6ff"Tb4b4b4:
Tff7b72return Te6edf3fake_codecs
Tff7b72if Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffLXST.Primitives.TelephonyTa5d6ff"Tb4b4b4:
Tff7b72raise Tf85149ImportErrorTb4b4b4(Ta5d6ff"Ta5d6fftelephony skipped in testTa5d6ff"Tb4b4b4)
Tff7b72raise Tf85149ImportErrorTb4b4b4(Te6edf3nameTb4b4b4)

Tff7b72with Tb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ffprobe_pycodec2Ta5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tb4b4b4(Tff7b72TrueTb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3android_codec2Tff7b72.Td2a8ffimportlibTb4b4b4, Ta5d6ff"Ta5d6ffimport_moduleTa5d6ff"Tb4b4b4, Te6edf3side_effectTff7b72=Te6edf3import_module
Tb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3android_codec2Tff7b72.Td2a8ffimportlibTb4b4b4, Ta5d6ff"Ta5d6ffreloadTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Te6edf3reloaded
Tb4b4b4) Tff7b72as Te6edf3reload_mockTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3android_codec2Tff7b72.Td2a8ffensure_lxst_codec2_bindingTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Te6edf3reload_mockTff7b72.Td2a8ffcalled


Tff7b72def Td2a8fftest_probe_falls_back_to_ctypes_on_android_when_pycodec2_brokenTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3android_codec2Tff7b72.Td2a8ffreset_codec2_preload_state_for_testsTb4b4b4(Tb4b4b4)

Tff7b72with Tb4b4b4(
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ff_is_chaquopy_androidTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3android_codec2Tb4b4b4, Ta5d6ff"Ta5d6ffensure_codec2_native_libraryTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffdictTb4b4b4(Ta5d6ff"Ta5d6ffsys.modulesTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffpycodec2Ta5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72import T7ee787builtins

Te6edf3real_import Tff7b72= Te6edf3builtinsTff7b72.Td2a8ff__import__

Tff7b72def Td2a8fffake_importTb4b4b4(Te6edf3nameTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffpycodec2Ta5d6ff"Tb4b4b4:
Tff7b72raise Tf85149ImportErrorTb4b4b4(Ta5d6ff"Ta5d6ffempty pycodec2.soTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3real_importTb4b4b4(Te6edf3nameTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)

Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffbuiltins.__import__Ta5d6ff"Tb4b4b4, Te6edf3side_effectTff7b72=Te6edf3fake_importTb4b4b4)Tb4b4b4,
Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3android_codec2Tb4b4b4,
Ta5d6ff"Ta5d6ff_install_pycodec2_ctypes_fallbackTa5d6ff"Tb4b4b4,
Te6edf3return_valueTff7b72=Tb4b4b4(Tff7b72TrueTb4b4b4, Tff7b72NoneTb4b4b4)Tb4b4b4,
Tb4b4b4) Tff7b72as Te6edf3installTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3okTb4b4b4, Te6edf3err Tff7b72= Te6edf3android_codec2Tff7b72.Td2a8ffprobe_pycodec2Tb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3ok Tff7b72is Tff7b72True
Tff7b72assert Te6edf3err Tff7b72is Tff7b72None
Te6edf3installTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_vendor_wheels_bundle_libcodec2_for_all_abisTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72import T7ee787zipfile

Te6edf3repo Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3vendor Tff7b72= Te6edf3repo Tff7b72/ Ta5d6ff"Ta5d6ffandroidTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffvendorTa5d6ff"
Tff7b72if Tff7b72not Te6edf3vendorTff7b72.Td2a8ffis_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffandroid/vendor not present (gitignored)Ta5d6ff"Tb4b4b4)
Te6edf3abis Tff7b72= Tb4b4b4(Ta5d6ff"Ta5d6ffarm64_v8aTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffarmeabi_v7aTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffx86_64Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3abi Tff7b72in Te6edf3abisTb4b4b4:
Te6edf3wheels Tff7b72= Tffa657sortedTb4b4b4(Te6edf3vendorTff7b72.Td2a8ffglobTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffpycodec2-*-android_24_Tffd700{Te6edf3abiTffd700}Ta5d6ff.whlTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3wheelsTb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffmissing pycodec2 wheel for Tffd700{Te6edf3abiTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3wheelsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72as Te6edf3zinTb4b4b4:
Tff7b72assert Ta5d6ff"Ta5d6ffpycodec2/libcodec2.soTa5d6ff" Tff7b72in Te6edf3zinTff7b72.Td2a8ffnamelistTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffpycodec2/pycodec2.soTa5d6ff" Tff7b72in Te6edf3zinTff7b72.Td2a8ffnamelistTb4b4b4(Tb4b4b4)
T8b949e# Empty stub extensions (a few KB, no PyInit) cannot provide Codec2.
T8b949e# ctypes fallback covers those builds until wheels are rebuilt.
Te6edf3stub_size Tff7b72= Te6edf3zinTff7b72.Td2a8ffgetinfoTb4b4b4(Ta5d6ff"Ta5d6ffpycodec2/pycodec2.soTa5d6ff"Tb4b4b4)Tff7b72.Td2a8fffile_size
Tff7b72assert Te6edf3stub_size Tff7b72> T79c0ff0
Te6edf3lib_size Tff7b72= Te6edf3zinTff7b72.Td2a8ffgetinfoTb4b4b4(Ta5d6ff"Ta5d6ffpycodec2/libcodec2.soTa5d6ff"Tb4b4b4)Tff7b72.Td2a8fffile_size
Tff7b72assert Te6edf3lib_size Tff7b72> T79c0ff100_000
Te6edf3lib_wheels Tff7b72= Tffa657sortedTb4b4b4(Te6edf3vendorTff7b72.Td2a8ffglobTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffchaquopy_libcodec2-*-android_24_Tffd700{Te6edf3abiTffd700}Ta5d6ff.whlTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3lib_wheelsTb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffmissing chaquopy_libcodec2 for Tffd700{Te6edf3abiTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3lib_wheelsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72as Te6edf3zinTb4b4b4:
Tff7b72assert Ta5d6ff"Ta5d6ffchaquopy/lib/libcodec2.soTa5d6ff" Tff7b72in Te6edf3zinTff7b72.Td2a8ffnamelistTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_jni_libs_synced_for_all_abisTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3repo Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3jni Tff7b72= Te6edf3repo Tff7b72/ Ta5d6ff"Ta5d6ffandroidTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffappTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffsrcTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffmainTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffjniLibsTa5d6ff"
Tff7b72for Te6edf3abi Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ffarm64-v8aTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffarmeabi-v7aTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffx86_64Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3lib Tff7b72= Te6edf3jni Tff7b72/ Te6edf3abi Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"
Tff7b72if Tff7b72not Te6edf3libTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffmissing jniLibs Tffd700{Te6edf3libTffd700}Ta5d6ff: not an Android buildTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3libTff7b72.Td2a8ffstatTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffst_size Tff7b72> T79c0ff100_000


Tff7b72def Td2a8fftest_android_lxst_wheel_get_codec_guards_missing_codec2Tb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72import T7ee787zipfile

Te6edf3repo Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3whl Tff7b72= Te6edf3repo Tff7b72/ Ta5d6ff"Ta5d6ffandroidTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffvendorTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6fflxst-0.4.8-py3-none-any.whlTa5d6ff"
Tff7b72if Tff7b72not Te6edf3whlTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffandroid/vendor/lxst wheel not present (gitignored)Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3whlTb4b4b4) Tff7b72as Te6edf3zinTb4b4b4:
Te6edf3telephony Tff7b72= Te6edf3zinTff7b72.Td2a8ffreadTb4b4b4(Ta5d6ff"Ta5d6ffLXST/Primitives/Telephony.pyTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Te6edf3codecs_init Tff7b72= Te6edf3zinTff7b72.Td2a8ffreadTb4b4b4(Ta5d6ff"Ta5d6ffLXST/Codecs/__init__.pyTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffif Codec2 is not None:Ta5d6ff" Tff7b72in Te6edf3telephony
Tff7b72assert Ta5d6ff"Ta5d6ff_CODEC2_IMPORT_ERRORTa5d6ff" Tff7b72in Te6edf3codecs_init


Tff7b72def Td2a8fftest_repack_script_bundles_libcodec2Tb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787importlibT7ee787.T7ee787util
Tff7b72import T7ee787zipfile

Te6edf3repo_root Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3script Tff7b72= Te6edf3repo_root Tff7b72/ Ta5d6ff"Ta5d6ffscriptsTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffrepack-android-pycodec2-wheels.pyTa5d6ff"
Te6edf3spec Tff7b72= Te6edf3importlibTff7b72.Td2a8ffutilTff7b72.Td2a8ffspec_from_file_locationTb4b4b4(Ta5d6ff"Ta5d6ffrepack_pycodec2Ta5d6ff"Tb4b4b4, Te6edf3scriptTb4b4b4)
Te6edf3repack_mod Tff7b72= Te6edf3importlibTff7b72.Td2a8ffutilTff7b72.Td2a8ffmodule_from_specTb4b4b4(Te6edf3specTb4b4b4)
Te6edf3specTff7b72.Td2a8ffloaderTff7b72.Td2a8ffexec_moduleTb4b4b4(Te6edf3repack_modTb4b4b4)
Te6edf3repack_pycodec2_wheel Tff7b72= Te6edf3repack_modTff7b72.Td2a8ffrepack_pycodec2_wheel

Te6edf3lib_wheel Tff7b72= Tb4b4b4(
Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffchaquopy_libcodec2-1.2.0-0-py3-none-android_24_arm64_v8a.whlTa5d6ff"
Tb4b4b4)
Te6edf3py_wheel Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffpycodec2-4.1.1-0-cp311-cp311-android_24_arm64_v8a.whlTa5d6ff"

Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3lib_wheelTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3zoutTb4b4b4:
Te6edf3zoutTff7b72.Td2a8ffwritestrTb4b4b4(Ta5d6ff"Ta5d6ffchaquopy/lib/libcodec2.soTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\x7fTa5d6ffELF-libTa5d6ff"Tb4b4b4)

Te6edf3record Tff7b72= Tb4b4b4(
Ta5d6ff"Ta5d6ffpycodec2/pycodec2.so,sha256=deadbeef,8Tffea00\nTa5d6ff"
Ta5d6ff"Ta5d6ffpycodec2.dist-info/METADATA,sha256=deadbeef,4Tffea00\nTa5d6ff"
Ta5d6ff"Ta5d6ffpycodec2.dist-info/RECORD,,Tffea00\nTa5d6ff"
Tb4b4b4)
Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3py_wheelTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3zoutTb4b4b4:
Te6edf3zoutTff7b72.Td2a8ffwritestrTb4b4b4(Ta5d6ff"Ta5d6ffpycodec2/pycodec2.soTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\x7fTa5d6ffELF-modTa5d6ff"Tb4b4b4)
Te6edf3zoutTff7b72.Td2a8ffwritestrTb4b4b4(Ta5d6ff"Ta5d6ffpycodec2.dist-info/METADATATa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffmetaTa5d6ff"Tb4b4b4)
Te6edf3zoutTff7b72.Td2a8ffwritestrTb4b4b4(Ta5d6ff"Ta5d6ffpycodec2.dist-info/RECORDTa5d6ff"Tb4b4b4, Te6edf3recordTb4b4b4)

Te6edf3lib_src Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"
Te6edf3lib_srcTff7b72.Td2a8ffwrite_bytesTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x7fTa5d6ffELF-libTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3repack_pycodec2_wheelTb4b4b4(Te6edf3py_wheelTb4b4b4, Te6edf3lib_srcTb4b4b4)

Tff7b72with Te6edf3zipfileTff7b72.Td2a8ffZipFileTb4b4b4(Te6edf3py_wheelTb4b4b4) Tff7b72as Te6edf3zinTb4b4b4:
Te6edf3names Tff7b72= Te6edf3zinTff7b72.Td2a8ffnamelistTb4b4b4(Tb4b4b4)
Te6edf3record_text Tff7b72= Te6edf3zinTff7b72.Td2a8ffreadTb4b4b4(Ta5d6ff"Ta5d6ffpycodec2.dist-info/RECORDTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ffpycodec2/libcodec2.soTa5d6ff" Tff7b72in Te6edf3names
Tff7b72assert Ta5d6ff"Ta5d6ff,,Tffea00\nTa5d6ff" Tff7b72not Tff7b72in Te6edf3record_text
Tff7b72for Te6edf3line Tff7b72in Te6edf3record_textTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3size_field Tff7b72= Te6edf3lineTff7b72.Td2a8ffrsplitTb4b4b4(Ta5d6ff"Ta5d6ff,Ta5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]
Tff7b72assert Te6edf3size_field
Tffa657intTb4b4b4(Te6edf3size_fieldTb4b4b4)


Tff7b72def Td2a8fftest_pycodec2_ctypes_roundtrip_with_system_or_jni_libTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Ctypes Codec2 must encode/decode when libcodec2 is available."""
Tff7b72import T7ee787ctypesT7ee787.T7ee787util

Tff7b72from T7ee787meshchatx Tff7b72import Te6edf3pycodec2_ctypes

Te6edf3repo Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparentsTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3jni_lib Tff7b72= Tb4b4b4(
Te6edf3repo
Tff7b72/ Ta5d6ff"Ta5d6ffandroidTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffappTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffsrcTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffmainTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffjniLibsTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffarm64-v8aTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6fflibcodec2.soTa5d6ff"
Tb4b4b4)
Te6edf3system_lib Tff7b72= Te6edf3ctypesTff7b72.Td2a8ffutilTff7b72.Td2a8fffind_libraryTb4b4b4(Ta5d6ff"Ta5d6ffcodec2Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3system_libTb4b4b4:
Te6edf3lib_path Tff7b72= Te6edf3system_lib
Tff7b72elif Te6edf3jni_libTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# Android aarch64 .so will not load on x86_64 hosts.
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffhost cannot load Android arm64 libcodec2.soTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6fflibcodec2 not available on hostTa5d6ff"Tb4b4b4)

Te6edf3pycodec2_ctypesTff7b72.Td2a8ff_lib Tff7b72= Tff7b72None
Te6edf3pycodec2_ctypesTff7b72.Td2a8ff_lib_error Tff7b72= Tff7b72None
Tff7b72with Te6edf3patchTff7b72.Td2a8ffdictTb4b4b4(Ta5d6ff"Ta5d6ffos.environTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffMESHCHAT_LIBCODEC2_PATHTa5d6ff"Tb4b4b4: Tffa657strTb4b4b4(Te6edf3lib_pathTb4b4b4)Tb4b4b4}Tb4b4b4)Tb4b4b4:
Te6edf3okTb4b4b4, Te6edf3err Tff7b72= Te6edf3pycodec2_ctypesTff7b72.Td2a8ffprobeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3okTb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffctypes Codec2 probe failed: Tffd700{Te6edf3errTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72import T7ee787numpy Tff7b72as T7ee787np

Te6edf3c2 Tff7b72= Te6edf3pycodec2_ctypesTff7b72.Td2a8ffCodec2Tb4b4b4(T79c0ff1600Tb4b4b4)
Te6edf3spf Tff7b72= Te6edf3c2Tff7b72.Td2a8ffsamples_per_frameTb4b4b4(Tb4b4b4)
Te6edf3samples Tff7b72= Te6edf3npTff7b72.Td2a8ffzerosTb4b4b4(Te6edf3spfTb4b4b4, Te6edf3dtypeTff7b72=Te6edf3npTff7b72.Td2a8ffint16Tb4b4b4)
Te6edf3encoded Tff7b72= Te6edf3c2Tff7b72.Td2a8ffencodeTb4b4b4(Te6edf3samplesTb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3encodedTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3encodedTb4b4b4) Tff7b72== Te6edf3c2Tff7b72.Td2a8ffbytes_per_frameTb4b4b4(Tb4b4b4)
Te6edf3decoded Tff7b72= Te6edf3c2Tff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3encodedTb4b4b4)
Tff7b72assert Te6edf3decodedTff7b72.Td2a8ffdtype Tff7b72== Te6edf3npTff7b72.Td2a8ffint16
Tff7b72assert Te6edf3decodedTff7b72.Td2a8ffsize Tff7b72== Te6edf3spf
Te6edf3pycodec2_ctypesTff7b72.Td2a8ff_lib Tff7b72= Tff7b72None
Te6edf3pycodec2_ctypesTff7b72.Td2a8ff_lib_error Tff7b72= Tff7b72None


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────